import org.junit.Test;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.ResourceBundle;

/**
 *  注意配置文件放的位置：
 *  1.若通过创建输入流来获取配置文件内容，就应该将配置文件放到模块下面
 *  2.若通过 ”资源绑定器ResourceBundle“ 来读取配置文件内容，就应该将配置文件放到src文件夹下面
 */



public class PropertiesTest {

    /**
     * 方式一：通过创建字节流来读取配置文件内容,配置文件放在模块下面;
     *        可以通过Properties类中的setProperty()方法，去写入配置信息；
     *        可以通过Properties类中的getProperty()方法，去读取配置信息；
     */
    @Test
    public void Test1(){
        FileInputStream fis=null;
        try {
            //1.加载配置文件
            Properties pros=new Properties();//先创建一个配置文件对象
            fis=new FileInputStream("jdbc.properties");//利用输入流读取配置文件信息
            pros.load(fis);//将这个本地配置文件信息，读取到创建的配置文件对象pros中去

            //2.读取配置信息
            String user = pros.getProperty("user");//获取配置文件中user的值
            String password = pros.getProperty("password");//获取配置文件中password的值

            System.out.println("user:"+user);//输出结果
            System.out.println("password:"+password);

            //3.写入配置文件信息，但是不会在配置文件中显示。
            /**
             *  注意：写入配置文件信息，但是不会在配置文件中显示出来。
             */
            pros.setProperty("name1","刘明福");
            pros.setProperty("name2","里卡多");
            pros.setProperty("name3","雕刻机");

            System.out.println(pros.getProperty("name1"));//打印结果
            System.out.println(pros.getProperty("name2"));
            System.out.println(pros.getProperty("name3"));

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //3.关闭资源
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    /**
     * 方式二：通过 ”资源绑定器ResourceBundle“ 来读取配置文件内容，就应该将配置文件放到src文件夹下面;
     *       ”资源绑定器ResourceBundle“ 中没有写入配置文件信息的方法；
     *       因此要往配置文件中写入信息，需要直接在配置文件中写入键值对信息
     */
    @Test
    public void Test2(){

            //调用资源绑定器的getBundle()方法，获取配置文件对象
            ResourceBundle bundle=ResourceBundle.getBundle("jdbc1");//不带文件后缀名
            //调用资源绑定器的getString()方法，获取配置文件中的值
            String driver=bundle.getString("driverClass");
            String url=bundle.getString("url");
            String user=bundle.getString("user");
            String password=bundle.getString("password");
            //打印结果
            System.out.println("driverClass:"+driver);
            System.out.println("url:"+url);
            System.out.println("user:"+user);
            System.out.println("password:"+password);

    }
    /**
     * 方式三：通过ClassLoader类的getSystemClassLoader()方法，再调用getResourceAsStream()去读取配置文件;
     *        可以通过Properties类中的setProperty()方法，去写入配置信息；
     *        可以通过Properties类中的getProperty()方法，去读取配置信息；
     */
    @Test
    public void Test3(){
        InputStream is=null;
        try {
            //1.加载配置文件
            Properties pros=new Properties(); //创建一个配置文件对象
            /**
             * ClassLoader:就是一个ClassLoader类
             * getSystemClassLoader()：是ClassLoader类中的一个方法，返回一个系统类加载器,是ClassLoader类型
             * getResourceAsStream()：是ClassLoader类中的一个方法，返回一个读取指定资源的输入流，是InputStream类型
             */
            //ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
            is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc2.properties");
            pros.load(is);

            //2.读取配置信息
            String user = pros.getProperty("user");//获取配置文件中user的值
            String password = pros.getProperty("password");//获取配置文件中password的值

            System.out.println("user:"+user);//输出结果
            System.out.println("password:"+password);

            //3.写入配置文件信息，但是不会在配置文件中显示。
            /**
             *  注意：写入配置文件信息，但是不会在配置文件中显示出来。
             */
            pros.setProperty("name1","lmf");
            pros.setProperty("name2","xc");
            pros.setProperty("name3","lsp");

            System.out.println(pros.getProperty("name1"));//打印结果
            System.out.println(pros.getProperty("name2"));
            System.out.println(pros.getProperty("name3"));

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //3.释放资源
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
